package com.cskaoyan.market.controller;

import com.cskaoyan.market.db.domain.MarketAd;
import com.cskaoyan.market.db.domain.MarketAdmin;
import com.cskaoyan.market.service.AdminAuthService;
import com.cskaoyan.market.service.AdminAuthServiceImpl;
import com.cskaoyan.market.util.ResponseUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2024/6/17 10:49
 * @Version 1.0
 */
@RestController
@RequestMapping("/admin/auth")
public class AdminAuthController {

    @Autowired
    AdminAuthService adminAuthService;


    @PostMapping("login")
    public Object login(@RequestBody Map<String, String> map, HttpSession session) throws IOException {
        String username = map.get("username");
        String password = map.get("password");

        if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
            //
            Object fail = ResponseUtil.fail(601, "用户帐号或密码为空");
            //不要自己去new ObjectMapper，为什么？？因为JacksonUtils里面有，只需要获取即可

            return fail;
        }
        //后面如果你有其他的需求，比如长度上面的要求，那么再去进一步校验即可
        MarketAdmin admin = adminAuthService.login(username, password);

        //判断登录有没有成功，登录成功返回什么一个对象，登录失败返回什么null
        if(admin != null){
            //登录成功  根据公网抓包的返回结果，应返回下面的内容
            session.setAttribute("admin", admin);

            Map<String, Object> data = new HashMap<>();
            Map<String, String> adminInfo = new HashMap<>();
            adminInfo.put("nickName", admin.getUsername());
            adminInfo.put("avatar", admin.getAvatar());
            data.put("adminInfo", adminInfo);
            //把session的编号返回给前端，它需要
            data.put("token", session.getId());
            Object ok = ResponseUtil.ok(data);
            return ok;
        }else {
            //登录失败 {"errno":605,"errmsg":"用户帐号或密码不正确"}
            //考虑到无论成功还是失败，返回的结果都有errrno、errmsg，我们可以设计一个通用类来充当结果的封装
            //里面返回的状态码，大家小组可以自行确认
            //系统中只会用0来确认成功，非0确认失败
            Object fail = ResponseUtil.fail(605, "用户帐号或密码不正确");
            //不要自己去new ObjectMapper，为什么？？因为JacksonUtils里面有，只需要获取即可
            return fail;
        }
    }


    @GetMapping("info")
    public Object info(@SessionAttribute("admin")MarketAdmin admin) {
        //不需要去接收用户输入的参数，直接返回结果即可
        //响应需要的内容：name、avatar直接从session域获取；perms、roles项目一暂时处理不了，直接写死

        Map<String, Object> data = new HashMap<>();
        data.put("roles", Arrays.asList("超级管理员"));
        data.put("name", admin.getUsername());
        data.put("avatar", admin.getAvatar());
        data.put("perms", Arrays.asList("*"));
        Object ok = ResponseUtil.ok(data);
        return ok;
    }
}
